package com.niit.handlers;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;

// List<String>  你想要的java类型
public class ListTypeHandler extends BaseTypeHandler<List<String>>{
    // insert into users (userId, userPwd, userHobbies) values (?, ?, ?)

    // [唱歌,跳舞,画画,看电影]  <-->   唱歌;跳舞;画画;看电影;
    // List<String>  <--->  varchar/String  先转换类型，然后再设置到SQL中
    @Override
    /**
     * 将 List<String> 类型的用户爱好转换为字符串，并设置到 SQL 语句中。
     *
     * @param preparedStatement 预编译的 SQL 语句
     * @param i 参数索引
     * @param hobbies 用户爱好列表
     * @param jdbcType JDBC 类型
     * @throws SQLException SQL 异常
     */
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, List<String> hobbies, JdbcType jdbcType) throws SQLException {

        StringBuilder builder = new StringBuilder();

        for (String hobby : hobbies) {
            builder.append(hobby).append(";");
        }

        String hobbiesStr = builder.toString();
        // 将 拼接好的 hobbies字符串 设置到SQL中
        preparedStatement.setString(i, hobbiesStr);
    }

    @Override
    /**
     * 从 ResultSet 中获取用户爱好字符串，并转换为 List<String> 类型。
     *
     * @param resultSet 查询结果集
     * @param s 列名
     * @return 用户爱好列表
     * @throws SQLException SQL 异常
     */
    public List<String> getNullableResult(ResultSet resultSet, String hobbiesColumnName) throws SQLException {
        // 唱歌;跳舞;画画;看电影;
        // 从结果集中 获取到 userHobbies字符串 条件是列名
        String hobbiesStr = resultSet.getString(hobbiesColumnName);
        String[] hobbiesArr = hobbiesStr.split(";");
        return Arrays.asList(hobbiesArr);
    }

    @Override
    /**
     * 从 ResultSet 中获取用户爱好字符串，并转换为 List<String> 类型。
     *
     * @param resultSet 查询结果集
     * @param i 列索引
     * @return 用户爱好列表
     * @throws SQLException SQL 异常
     */
    public List<String> getNullableResult(ResultSet resultSet, int hobbiesColumnIndex) throws SQLException {
        // 唱歌;跳舞;画画;看电影;
        // 从结果集中 获取到 userHobbies字符串 条件是列名
        String hobbiesStr = resultSet.getString(hobbiesColumnIndex);
        String[] hobbiesArr = hobbiesStr.split(";");
        return Arrays.asList(hobbiesArr);
    }

    @Override
    /**
     * 从 CallableStatement 中获取用户爱好字符串，并转换为 List<String> 类型。
     *
     * @param callableStatement 可调用语句
     * @param i 参数索引
     * @return 用户爱好列表
     * @throws SQLException SQL 异常
     */
    public List<String> getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        String hobbiesStr = callableStatement.getString(i);
        String[] hobbiesArr = hobbiesStr.split(";");
        return Arrays.asList(hobbiesArr);
    }
}